package com.xiaolun.synchronizedReview;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 1、资源类：实例变量 + 实例方法（实例方法指空调身上的制冷和制热功能，这个功能是其
 * 自己带，即高内聚。空调设计人员没有咨询你空调的设计，即低耦合）
 * 内聚是指：内聚变量和方法
 */
class Ticket {
	/**
	 * 1、number 可以将其看作空调出场的时候，
	 * 默认的温度值。
	 * 2、A,B抢空调进行设置制冷和制热（其制冷和制热功能对应
	 * sale()方法），一个将其加一度，一个将其减一度。
	 * 3、现在 number和sale()都封装到 Ticket 中，这就叫做
	 * 高内聚。
	 * 4、说白了，高内聚（自己动手，丰衣足食）：你要操作什么东西，这个东西就叫做资源类，你要对它
	 * 进行什么操作，资源类要自身携带这些方法，而不是外部提供。
	 */
	private int number = 30;

	//	List list =new ArrayList();
	Lock lock = new ReentrantLock(); //可重入锁

	/**
	 * 1、public synchronized void sale()是将代码块中的代码全部锁了
	 * 2、冤有头，债有主。
	 */
	public void sale() {
		lock.lock();
		try {
			if (number > 0) {
				System.out.println(Thread.currentThread().getName() + "\t 卖出第：" + (number--) + "\t 票，还剩下：" + (number) + "票");
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			lock.unlock();
		}
	}
}


/**
 * 1、题目： 三个售货员 卖出 30张票
 * 2、企业级的多线程代码
 * （1）、在高内聚低耦合的前提下，线程 操作 资源类
 * （a）一言不合，先创建一个资源类（小明 使用遥控器操作 空调）
 */
public class SaleTickDemo01 {
	public static void main(String[] args) {//主线程，一切程序的入口
		Ticket ticket = new Ticket();
		new Thread(() -> {for (int i = 0; i < 40; i++) ticket.sale();},"A").start();
		new Thread(() -> {for (int i = 0; i < 40; i++) ticket.sale();},"B").start();
		new Thread(() -> {for (int i = 0; i < 40; i++) ticket.sale();},"C").start();
//		Ticket ticket = new Ticket();
//
////    Thread t1 = new Thread();
//		new Thread(new Runnable() {
//			@Override
//			public void run() {
//				for (int i = 0; i < 40; i++) {
//					//A线程要操作资源类
//					ticket.sale();
//				}
//			}
//		}, "A").start();
//
//		new Thread(new Runnable() {
//			@Override
//			public void run() {
//				for (int i = 0; i < 40; i++) {
//					//A线程要操作资源类
//					ticket.sale();
//				}
//			}
//		}, "B").start();
//
//		new Thread(new Runnable() {
//			@Override
//			public void run() {
//				for (int i = 0; i < 40; i++) {
//					//A线程要操作资源类
//					ticket.sale();
//				}
//			}
//		}, "C").start();

	}
}
